/**
 * ***************************************
 * @file mygui.h
 * @author: AnRui
 * @version 0.1
 * @date  : 2025-07-02
 * @copyright Copyright (c) 2025
 * @desc:
 *      调试代码:
 *              printf("Page width: %d\n", lv_obj_get_width(line));
 *              lv_obj_set_style_border_width(ui->screenTitleLable, 1, 0);
 *              lv_obj_set_style_border_color(ui->screenTitleLable, lv_color_hex(0x333333), 0);
 *              lv_obj_set_style_bg_color(ui->screenTempContainer, lv_color_hex(0x333333), LV_PART_MAIN);
 *      开发经验总结:
 *      父组件使用flex布局 内部元素之间的定位会失效
 *      清除掉所有格式后 透明度默认为0 全透明
 *      必须是lv_event_get_current_target不能是lv_event_get_target
 *      移植到stm32中 字体文件中的 "#include "lvgl/lvgl.h""
 *      lvgl的字体的编码格式为utf-8
 *      使用 lv_obj_align_to(container1, line, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 90); 来实现margin的效果
 *      使用自定义字体时 出现未知字符 lvgl会用空字符代替 所以在生成字体的时候需要把0x20(空格) 加进去
 *      使用直线时 static lv_point_t line_points[2]; 一定要使用static 因为 LVGL 库的 lv_line_set_points 函数 仅存储指针
 *      使用对齐的时候 尽量使用相对屏幕的绝对定位 少使用相对于另一空间的 对齐方式 这种方式容器跑偏
 *      使用特殊组件时 需要在lvgl_conf.h中打开
 *      label组件是不支持点击事件的
 *      日历默认年份到2023
 *      char textBuf[16]; 填充数组很有用
 *      memset(buf, 0, sizeof(buf));
 *      sprintf(textBuf, "%d-%02d-%02d", rtc_time.year, rtc_time.month, rtc_time.day);
 *      LV_SIZE_CONTENT 根据内容的高度 自适应
 *      lv_obj_set_style_height(ui->screenTempContainer, LV_SIZE_CONTENT, LV_PART_MAIN);
 *      添加禁用等状态
 *      lv_obj_add_state(btn, LV_STATE_DISABLED);
 *      lv_obj_clear_state(btn, LV_STATE_DISABLED);  // 恢复按钮状态
 *
 *      屏幕切换:
 *              不带动画:
 *                    lv_scr_load(new_screen);
 *                    lv_obj_del(old_screen); 是否删除就屏幕根据情况
 *              带动画:
 *                    lv_scr_load_anim(new_screen, LV_SCR_LOAD_ANIM_SLIDE_LEFT, 500, 0, false);
 *                    参数说明：新屏幕、动画类型、动画时长（ms）、延迟时间（ms）、是否自动删除旧屏幕（false 保留）
 *              注意:
 *                  1. 如果有多个页面 频繁切换屏幕时，若不销毁旧屏幕，可能导致内存泄漏（尤其是嵌入式设备）
 *                     建议仅保留必要的历史屏幕，或使用 “单例模式” 管理屏幕（每次切换前销毁旧屏幕）。
 *                  2. 旧屏幕隐藏后，其控件的事件回调仍可能触发（如定时器事件），需手动停止或在回调中判断屏幕是否可见：
 *                      if (lv_obj_is_valid(old_screen) && lv_obj_is_visible(old_screen)) {
 *                          // 仅在屏幕有效且可见时执行操作
 *                      }
 *
 * ***************************************
 */
#ifndef __MYGUI_H__
#define __MYGUI_H__
#include <stdio.h>
#include "lvgl.h"
#include "rtc_drv.h"
#include "sensor_drv.h"
typedef struct {
    lv_obj_t* screen;
    lv_obj_t* screenTitleLable;
    lv_obj_t* screenLine;
    lv_obj_t* screenTempContainer;
    lv_obj_t* screenTempImg;
    lv_obj_t* screenTempDescLabel;
    lv_obj_t* screenTempValueLabel;
    lv_obj_t* screenHumiContainer;
    lv_obj_t* screenHumiImg;
    lv_obj_t* screenHumiDescLabel;
    lv_obj_t* screenHumiValueLabel;
    lv_obj_t* screen1;
    lv_obj_t* screen1TitleLable;
    lv_obj_t* screen1Line;
    lv_obj_t* screen1DateContainer;
    lv_obj_t* screen1DateDescLabel;
    lv_obj_t* screen1DateValueTextarea;
    lv_obj_t* screen1TimeContainer;
    lv_obj_t* screen1TimeDescLabel;
    lv_obj_t* screen1HourDropDown;
    lv_obj_t* screen1TimeSpaceLabel;
    lv_obj_t* screen1MinuteDropDown;
    lv_obj_t* screen1SaveButton;
    lv_obj_t* screen1SaveButtonLabel;
    lv_timer_t* screenGetSensorDataTimer;
}lv_ui;

// 导入的字体和图片文件
LV_IMG_DECLARE(humi_img);
LV_IMG_DECLARE(temp_img);
LV_FONT_DECLARE(SourceHanSerifSC_SemiBold_26);
LV_FONT_DECLARE(SourceHanSerifSC_SemiBold_28);
LV_FONT_DECLARE(SourceHanSerifSC_SemiBold_40);


/**
 * @desc  : 初始化
 * @date  : 2025-07-02
 * @author: AnRui
 * @note  :
 */
void MyGuiInit(void);


#endif
